#coding=utf-8
class Perceptron(object):
    # 初始化感知器，设置输入参数的个数，以及激活函数。
    # 激活函数的类型为double -> double
    def __init__(self, input_num, activator):
        self.activator = activator
        # 权重向量初始化为0
        self.weights = map(lambda _: 0.0, range(input_num))
        # 偏置项初始化为0
        self.bias = 0.0
    # 打印学习到的权重、偏置项
    def __str__(self):
        return 'weights\t:%s\nbias\t:%f' % (self.weights, self.bias)
    # 输入向量，输出感知器的计算结果
    def predict(self, input_vec):
        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
        # 最后利用reduce求和
        value = reduce(lambda a, b: a + b,
                   map(lambda (x, w): x * w,
                       zip(input_vec, self.weights))
                , 0.0) + self.bias
        return self.activator(
            value)

def get_training_dataset():
    # 构建训练集
    # 输入向量列表
    input_vecs = [1]*100
    label = [1]*100
    for i in range(10):
        for j in range(10):
            input_vecs[i*10+j] = [i,j]
            label[i*10+j] = 1 if i == j else 0
    return input_vecs,label

#定义激活函数f
def f(x):
    return 1 if x > 0 else 0

if __name__ == '__main__':
    j = 1